#include "album_play.h"

// ==============================
// 全局变量定义
// ==============================

lv_obj_t *img = NULL;           // 相册图片对象
lv_obj_t *img1 = NULL;          // 幻灯片图片对象  
lv_obj_t *img2 = NULL;          // 音乐界面图片对象
lv_timer_t *timer = NULL;       // 相册定时器
lv_timer_t *timer1 = NULL;      // 幻灯片定时器
bool isTimerPaused = false;     // 定时器暂停状态标志
uint8_t current_image = 0;      // 相册当前图片索引
uint8_t current_image_1 = 0;    // 幻灯片当前图片索引
uint8_t current_image_2 = 0;    // 音乐界面当前图片索引

// 图片路径数组定义
const char *images[] = {
    "S:/root/P1.jpg", "S:/root/P2.jpg", "S:/root/P3.jpg",
    "S:/root/P4.jpg", "S:/root/P5.jpg", "S:/root/P6.jpg"
};

const char *images_1[] = {
    "S:/root/slideshow_1.png", "S:/root/slideshow_2.png"
};

const char *images_2[] = {
    "S:/root/jay1.jpg", "S:/root/jay2.jpg", "S:/root/jay3.jpg", 
    "S:/root/jay4.jpg", "S:/root/jay5.jpg"
};

// 图片总数定义
uint8_t total_images = 6;   // 相册图片总数
uint8_t total_images_1 = 2; // 幻灯片图片总数
uint8_t total_images_2 = 5; // 音乐界面图片总数

// 样式定义
static lv_style_t style_pr; // 按下状态样式

// ==============================
// 样式初始化模块
// ==============================

/**
 * @brief 初始化相册播放相关样式
 * 设置图片按钮在按下状态时的样式效果
 */
void album_play_init_styles(void)
{
    lv_style_init(&style_pr);                           // 初始化样式对象
    lv_style_set_img_recolor_opa(&style_pr, LV_OPA_80); // 设置按下时图片重新着色透明度为80%
    lv_style_set_img_recolor(&style_pr, lv_color_black()); // 设置重新着色为黑色
    lv_style_set_transform_height(&style_pr, 5);        // 设置按下时高度变换效果为5像素
}

// ==============================
// 资源清理模块
// ==============================

/**
 * @brief 清理相册相关资源
 * 删除定时器并重置相关状态
 */
void album_cleanup(void)
{
    if(timer) {                    // 检查定时器是否存在
        lv_timer_del(timer);       // 删除定时器
        timer = NULL;              // 将定时器指针设为NULL
    }
    
    isTimerPaused = false;         // 重置暂停状态标志
    current_image = 0;             // 重置当前图片索引
    
    // 清理图片对象
    if(img) {                      // 检查图片对象是否存在
        lv_obj_del(img);           // 删除图片对象
        img = NULL;                // 重置图片对象指针
    }
    
    printf("Album resources cleaned up.\n"); // 输出清理信息
}

/**
 * @brief 清理幻灯片相关资源  
 * 删除定时器并重置相关状态
 */
void slideshow_cleanup(void)
{
    if(timer1) {                   // 检查幻灯片定时器是否存在
        lv_timer_del(timer1);      // 删除定时器
        timer1 = NULL;             // 将定时器指针设为NULL
    }
    
    current_image_1 = 0;           // 重置幻灯片当前图片索引
    
    // 清理幻灯片图片对象
    if(img1) {                     // 检查幻灯片图片对象是否存在
        lv_obj_del(img1);          // 删除幻灯片图片对象
        img1 = NULL;               // 重置幻灯片图片对象指针
    }
    
    printf("Slideshow resources cleaned up.\n"); // 输出清理信息
}

/**
 * @brief 清理音乐播放相关资源
 * 删除音乐播放相关对象和状态
 */
void music_cleanup(void)
{
    current_image_2 = 0;           // 重置音乐界面当前图片索引
    
    // 清理音乐图片对象
    if(img2) {                     // 检查音乐图片对象是否存在
        lv_obj_del(img2);          // 删除音乐图片对象
        img2 = NULL;               // 重置音乐图片对象指针
    }
    
    printf("Music resources cleaned up.\n"); // 输出清理信息
}

// ==============================
// 定时器回调模块
// ==============================

/**
 * @brief 相册定时器回调函数
 * @param timer 定时器对象指针
 * 每3秒自动切换到下一张图片
 */
void timer_cb(lv_timer_t *timer)
{
    if(!img || !timer) return;     // 安全检查：确保图片对象和定时器存在
    
    current_image = (current_image + 1) % total_images; // 计算下一张图片索引（循环）
    lv_img_set_src(img, images[current_image]);         // 设置新的图片源
    
    printf("Album: Switching to image %d/%d\n", current_image + 1, total_images); // 输出切换信息
}

/**
 * @brief 幻灯片定时器回调函数
 * @param timer 定时器对象指针
 * 每3秒自动切换到下一张幻灯片
 */
void timer_cb_1(lv_timer_t *timer)
{
    if(!img1 || !timer) return;    // 安全检查：确保图片对象和定时器存在
    
    current_image_1 = (current_image_1 + 1) % total_images_1; // 计算下一张幻灯片索引
    lv_img_set_src(img1, images_1[current_image_1]);          // 设置新的图片源
    
    printf("Slideshow: Switching to image %d/%d\n", current_image_1 + 1, total_images_1); // 输出切换信息
}

// ==============================
// 事件处理模块
// ==============================

/**
 * @brief 切换定时器暂停/恢复状态
 * @param e 事件对象
 * 控制相册自动播放的暂停和继续
 */
void toggle_timer(lv_event_t *e)
{
    lv_event_code_t code = lv_event_get_code(e); // 获取事件类型
    lv_obj_t *pause = lv_event_get_target(e);    // 获取触发事件的对象（暂停按钮）
    
    if(code == LV_EVENT_PRESSED) {               // 检查是否为按下事件
        if(isTimerPaused) {                      // 如果当前是暂停状态
            lv_timer_resume(timer);              // 恢复定时器运行
            isTimerPaused = false;               // 更新暂停状态标志
            lv_img_set_src(pause, "S:/root/pause.png"); // 切换按钮图标为暂停图标
            printf("Album: Timer resumed\n");    // 输出恢复信息
        } else {                                 // 如果当前是运行状态
            lv_timer_pause(timer);               // 暂停定时器
            isTimerPaused = true;                // 更新暂停状态标志
            lv_img_set_src(pause, "S:/root/start.png"); // 切换按钮图标为开始图标
            printf("Album: Timer paused\n");     // 输出暂停信息
        }
    }
}

/**
 * @brief 上一张按钮事件处理
 * @param e 事件对象
 * 切换到相册的前一张图片
 */
void event_handler_prev(lv_event_t *e)
{
    lv_event_code_t code = lv_event_get_code(e); // 获取事件类型
    
    if(code == LV_EVENT_PRESSED) {               // 检查是否为按下事件
        // 计算上一张图片索引（循环到末尾）
        current_image = (current_image - 1 + total_images) % total_images;
        lv_img_set_src(img, images[current_image]); // 设置新的图片源
        printf("Album: Previous image %d/%d\n", current_image + 1, total_images); // 输出切换信息
    }
}

/**
 * @brief 下一张按钮事件处理
 * @param e 事件对象
 * 切换到相册的下一张图片
 */
void event_handler_next(lv_event_t *e)
{
    lv_event_code_t code = lv_event_get_code(e); // 获取事件类型
    
    if(code == LV_EVENT_PRESSED) {               // 检查是否为按下事件
        current_image = (current_image + 1) % total_images; // 计算下一张图片索引
        lv_img_set_src(img, images[current_image]);         // 设置新的图片源
        printf("Album: Next image %d/%d\n", current_image + 1, total_images); // 输出切换信息
    }
}

/**
 * @brief 音乐界面上一张按钮事件处理
 * @param e 事件对象
 * 切换到音乐界面的前一张图片
 */
void event_handler_prev_1(lv_event_t *e)
{
    lv_event_code_t code = lv_event_get_code(e); // 获取事件类型
    
    if(code == LV_EVENT_PRESSED) {               // 检查是否为按下事件
        // 计算上一张图片索引（循环到末尾）
        current_image_2 = (current_image_2 - 1 + total_images_2) % total_images_2;
        lv_img_set_src(img2, images_2[current_image_2]); // 设置新的图片源
        printf("Music: Previous image %d/%d\n", current_image_2 + 1, total_images_2); // 输出切换信息
    }
}

/**
 * @brief 音乐界面下一张按钮事件处理
 * @param e 事件对象
 * 切换到音乐界面的下一张图片
 */
void event_handler_next_1(lv_event_t *e)
{
    lv_event_code_t code = lv_event_get_code(e); // 获取事件类型
    
    if(code == LV_EVENT_PRESSED) {               // 检查是否为按下事件
        current_image_2 = (current_image_2 + 1) % total_images_2; // 计算下一张图片索引
        lv_img_set_src(img2, images_2[current_image_2]);          // 设置新的图片源
        printf("Music: Next image %d/%d\n", current_image_2 + 1, total_images_2); // 输出切换信息
    }
}

// ==============================
// 自动播放设置模块
// ==============================

/**
 * @brief 设置相册自动播放
 * 创建定时器和暂停/继续控制按钮
 */
void setup_image_slider(void)
{
    if(timer) {                         // 安全检查：如果定时器已存在
        lv_timer_del(timer);            // 删除旧定时器
        timer = NULL;                   // 重置定时器指针
    }
    
    // 创建暂停/继续按钮
    lv_obj_t *pause = lv_imgbtn_create(lv_scr_act()); // 创建图片按钮对象
    lv_obj_set_pos(pause, 408, 420);                  // 设置按钮位置
    lv_obj_set_size(pause, 48, 48);                   // 设置按钮大小
    lv_imgbtn_set_src(pause, LV_IMGBTN_STATE_RELEASED, NULL, "S:/root/pause.png", NULL); // 设置按钮图片
    lv_obj_add_event_cb(pause, toggle_timer, LV_EVENT_PRESSED, NULL); // 绑定事件回调
    
    // 创建自动播放定时器（每3秒切换一次）
    timer = lv_timer_create(timer_cb, 3000, NULL);
    printf("Album auto-play setup complete (3s interval)\n"); // 输出设置完成信息
}

/**
 * @brief 设置幻灯片自动播放
 * 创建幻灯片切换定时器
 */
void setup_image_slider_1(void)
{
    if(timer1) {                        // 安全检查：如果定时器已存在
        lv_timer_del(timer1);           // 删除旧定时器
        timer1 = NULL;                  // 重置定时器指针
    }
    
    // 创建幻灯片自动播放定时器（每3秒切换一次）
    timer1 = lv_timer_create(timer_cb_1, 3000, NULL);
    printf("Slideshow auto-play setup complete (3s interval)\n"); // 输出设置完成信息
}

// ==============================
// 手动播放设置模块
// ==============================

/**
 * @brief 设置相册手动播放控制
 * 创建上一张/下一张控制按钮
 */
void setup_image_hand(void)
{
    // 创建上一张按钮
    lv_obj_t *prev = lv_imgbtn_create(lv_scr_act()); // 创建图片按钮对象
    lv_obj_set_pos(prev, 97, 423);                   // 设置按钮位置
    lv_obj_set_size(prev, 38, 38);                   // 设置按钮大小
    lv_imgbtn_set_src(prev, LV_IMGBTN_STATE_RELEASED, NULL, "S:/root/prev.png", NULL); // 设置按钮图片
    lv_obj_add_event_cb(prev, event_handler_prev, LV_EVENT_PRESSED, NULL); // 绑定事件回调
    
    // 创建下一张按钮
    lv_obj_t *next = lv_imgbtn_create(lv_scr_act()); // 创建图片按钮对象
    lv_obj_set_pos(next, 746, 425);                  // 设置按钮位置
    lv_obj_set_size(next, 38, 38);                   // 设置按钮大小
    lv_imgbtn_set_src(next, LV_IMGBTN_STATE_RELEASED, NULL, "S:/root/next.png", NULL); // 设置按钮图片
    lv_obj_add_event_cb(next, event_handler_next, LV_EVENT_PRESSED, NULL); // 绑定事件回调
    
    printf("Album manual controls setup complete\n"); // 输出设置完成信息
}

/**
 * @brief 设置音乐界面手动播放控制
 * 创建播放控制按钮组
 */
void setup_image_hand_1(void)
{
    // 创建播放/暂停按钮
    lv_obj_t *start_music = lv_imgbtn_create(lv_scr_act()); // 创建图片按钮对象
    lv_obj_set_size(start_music, 30, 30);                   // 设置按钮大小
    lv_obj_align(start_music, LV_ALIGN_TOP_LEFT, 500, 378); // 设置按钮对齐位置
    lv_obj_add_style(start_music, &style_pr, LV_STATE_PRESSED); // 添加按下状态样式
    lv_obj_add_flag(start_music, LV_OBJ_FLAG_CHECKABLE);    // 使按钮具有可切换状态
    
    // 设置按钮在不同状态下的图片
    lv_imgbtn_set_src(start_music, LV_IMGBTN_STATE_RELEASED, NULL, "S:/root/start_music.png", NULL); // 释放状态
    lv_imgbtn_set_src(start_music, LV_IMGBTN_STATE_CHECKED_RELEASED, NULL, "S:/root/pause_music.png", NULL); // 选中状态
    
    // 创建下一首按钮
    lv_obj_t *next_music_1 = lv_imgbtn_create(lv_scr_act()); // 创建图片按钮对象
    lv_obj_set_pos(next_music_1, 541, 378);                  // 设置按钮位置
    lv_obj_set_size(next_music_1, 30, 30);                   // 设置按钮大小
    lv_imgbtn_set_src(next_music_1, LV_IMGBTN_STATE_RELEASED, NULL, "S:/root/next_music_1.png", NULL); // 设置按钮图片
    lv_obj_add_event_cb(next_music_1, event_handler_next_1, LV_EVENT_PRESSED, NULL); // 绑定事件回调
    
    // 创建收藏按钮
    lv_obj_t *heart_music = lv_imgbtn_create(lv_scr_act()); // 创建图片按钮对象
    lv_obj_set_size(heart_music, 30, 30);                   // 设置按钮大小
    lv_obj_align(heart_music, LV_ALIGN_TOP_LEFT, 459, 378); // 设置按钮对齐位置
    lv_obj_add_style(heart_music, &style_pr, LV_STATE_PRESSED); // 添加按下状态样式
    lv_obj_add_flag(heart_music, LV_OBJ_FLAG_CHECKABLE);    // 使按钮具有可切换状态
    
    // 设置按钮在不同状态下的图片
    lv_imgbtn_set_src(heart_music, LV_IMGBTN_STATE_RELEASED, NULL, "S:/root/heart.png", NULL); // 释放状态
    lv_imgbtn_set_src(heart_music, LV_IMGBTN_STATE_CHECKED_RELEASED, NULL, "S:/root/redheart_music.png", NULL); // 选中状态
    
    printf("Music controls setup complete\n"); // 输出设置完成信息
}

// ==============================
// 界面创建模块
// ==============================

/**
 * @brief 创建相册测试界面
 * 包含自动播放和手动播放功能
 */
void test(void)
{
    printf("Creating album test interface...\n"); // 输出创建信息
    
    // 创建相册图片对象
    img = lv_img_create(lv_scr_act());     // 创建图片对象
    lv_obj_set_size(img, 700, 455);        // 设置图片显示大小
    lv_obj_align(img, LV_ALIGN_CENTER, 40, 0); // 设置图片对齐位置（居中偏右）
    lv_img_set_src(img, "S:/root/P1.jpg"); // 设置初始图片
    
    setup_image_hand();   // 设置手动播放控制
    setup_image_slider(); // 设置自动播放
    
    printf("Album test interface created successfully\n"); // 输出创建成功信息
}

/**
 * @brief 创建幻灯片界面
 * 在左上角显示自动切换的幻灯片
 */
void slideshow(void)
{
    printf("Creating slideshow interface...\n"); // 输出创建信息
    
    // 创建幻灯片图片对象
    img1 = lv_img_create(lv_scr_act());          // 创建图片对象
    lv_obj_set_size(img1, 220, 113);             // 设置图片显示大小
    lv_obj_align(img1, LV_ALIGN_OUT_TOP_LEFT, 63, 105); // 设置图片对齐位置（左上角偏移）
    lv_img_set_src(img1, "S:/root/slideshow_1.png"); // 设置初始图片
    
    setup_image_slider_1(); // 设置幻灯片自动播放
    
    printf("Slideshow interface created successfully\n"); // 输出创建成功信息
}

/**
 * @brief 创建音乐播放界面
 * 显示专辑封面和播放控制
 */
void music(void)
{
    printf("Creating music interface...\n"); // 输出创建信息
    
    // 创建音乐界面图片对象
    img2 = lv_img_create(lv_scr_act());          // 创建图片对象
    lv_obj_set_size(img2, 204, 158);             // 设置图片显示大小
    lv_obj_align(img2, LV_ALIGN_OUT_TOP_LEFT, 386, 265); // 设置图片对齐位置（左上角偏移）
    lv_img_set_src(img2, "S:/root/jay1.jpg");    // 设置初始专辑封面
    
    setup_image_hand_1(); // 设置音乐播放控制
    
    printf("Music interface created successfully\n"); // 输出创建成功信息
}

// ==============================
// 模块状态管理函数
// ==============================

/**
 * @brief 获取相册播放模块状态
 * 返回模块当前运行状态信息，用于调试和监控
 */
void album_play_get_status(void)
{
    printf("=== Album Play Module Status ===\n"); // 输出状态标题
    
    // 对象状态
    printf("Album Image: %s\n", img ? "Created" : "Not created"); // 相册图片状态
    printf("Slideshow Image: %s\n", img1 ? "Created" : "Not created"); // 幻灯片图片状态
    printf("Music Image: %s\n", img2 ? "Created" : "Not created"); // 音乐图片状态
    
    // 定时器状态
    printf("Album Timer: %s\n", timer ? "Running" : "Stopped"); // 相册定时器状态
    printf("Slideshow Timer: %s\n", timer1 ? "Running" : "Stopped"); // 幻灯片定时器状态
    printf("Timer Paused: %s\n", isTimerPaused ? "Yes" : "No"); // 定时器暂停状态
    
    // 当前图片索引
    printf("Album Current Image: %d/%d\n", current_image + 1, total_images); // 相册当前图片
    printf("Slideshow Current Image: %d/%d\n", current_image_1 + 1, total_images_1); // 幻灯片当前图片
    printf("Music Current Image: %d/%d\n", current_image_2 + 1, total_images_2); // 音乐当前图片
    
    printf("=== End of Status ===\n"); // 输出状态结束标记
}

/**
 * @brief 暂停所有播放功能
 * 暂停相册和幻灯片的自动播放
 */
void album_play_pause_all(void)
{
    if(timer && !isTimerPaused) {        // 检查相册定时器是否存在且未暂停
        lv_timer_pause(timer);           // 暂停相册定时器
        isTimerPaused = true;            // 更新暂停状态标志
        printf("Album playback paused\n"); // 输出暂停信息
    }
    
    if(timer1) {                         // 检查幻灯片定时器是否存在
        lv_timer_pause(timer1);          // 暂停幻灯片定时器
        printf("Slideshow playback paused\n"); // 输出暂停信息
    }
}

/**
 * @brief 恢复所有播放功能
 * 恢复相册和幻灯片的自动播放
 */
void album_play_resume_all(void)
{
    if(timer && isTimerPaused) {         // 检查相册定时器是否存在且已暂停
        lv_timer_resume(timer);          // 恢复相册定时器
        isTimerPaused = false;           // 更新暂停状态标志
        printf("Album playback resumed\n"); // 输出恢复信息
    }
    
    if(timer1) {                         // 检查幻灯片定时器是否存在
        lv_timer_resume(timer1);         // 恢复幻灯片定时器
        printf("Slideshow playback resumed\n"); // 输出恢复信息
    }
}

/**
 * @brief 重置所有播放状态
 * 将所有图片索引重置为初始状态
 */
void album_play_reset_all(void)
{
    current_image = 0;                   // 重置相册图片索引
    current_image_1 = 0;                 // 重置幻灯片图片索引
    current_image_2 = 0;                 // 重置音乐图片索引
    
    // 重置图片显示
    if(img) {                            // 检查相册图片是否存在
        lv_img_set_src(img, images[0]);  // 设置相册为第一张图片
    }
    
    if(img1) {                           // 检查幻灯片图片是否存在
        lv_img_set_src(img1, images_1[0]); // 设置幻灯片为第一张图片
    }
    
    if(img2) {                           // 检查音乐图片是否存在
        lv_img_set_src(img2, images_2[0]); // 设置音乐为第一张图片
    }
    
    printf("All album play states reset to initial\n"); // 输出重置信息
}